/*
 * @Author: liusheng
 * @Date: 2022-04-10 12:55:57
 * @LastEditors: liusheng
 * @LastEditTime: 2022-04-10 13:37:31
 * @Description: 
 * email:liusheng613@126.com
 * Copyright (c) 2022 by liusheng/liusheng, All Rights Reserved. 
 * 
 剑指 Offer II 018. 有效的回文
给定一个字符串 s ，验证 s 是否是 回文串 ，只考虑字母和数字字符，可以忽略字母的大小写。

本题中，将空字符串定义为有效的 回文串 。

 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出: true
解释："amanaplanacanalpanama" 是回文串
示例 2:

输入: s = "race a car"
输出: false
解释："raceacar" 不是回文串
 

提示：

1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
 

注意：本题与主站 125 题相同： https://leetcode-cn.com/problems/valid-palindrome/
 */

#include <string>
using namespace std;

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        int left = 0;
        int right = n - 1;

        while (left < right)
        {
            while(!isalnum(s[left]) && left < right)
            {
                ++left;
            }

            while(!isalnum(s[right]) && left < right)
            {
                --right;
            }

            if (tolower(s[left]) != tolower(s[right]))
            {
                return false;
            }

            ++left;
            --right;
        }

        return true;
    }
};
